package game.model;

import java.util.HashSet;
import java.util.Set;

/**
 * Clase espejo doble, utiliza un par de espejos simples, con lo cual
 * su comportamiento esta determinado en base a este.
 *
 */

public class EspejoDoble extends Espejo {
	private EspejoSimple ne;	// ne = Noreste
	private EspejoSimple so;	// so = Sudoeste

	/**
	 * Constructor del espejo doble.
	 * 
	 * @param orientacion orientacion inicial del espejo.
	 */
	
	public EspejoDoble(int orientacion) {
		int desfasaje = (orientacion + 2) % 4;
		setImagen(4);
		this.setOrientacion(orientacion);
		this.ne = new EspejoSimple(desfasaje);
		this.so = new EspejoSimple(orientacion);
	}
	
	@Override
	public void rotar(){
		this.setOrientacion((this.getOrientacion() + 1) % 2);
		ne.rotar();
		so.rotar();
	}
	
	@Override
	public Set<Rayo> getSalida(Rayo entrada) {
		return new HashSet<Rayo>();
	}
	
	@Override
	public String salvarEstado(String ubicacion) {
		return ubicacion + "4" + "," + getOrientacion() + "," + "0" + "," + "0" + "," + "0";
	}

	@Override
	public Set<Rayo> getSalida(Rayo entrada, Set<Rayo> anterior) {
		Set<Rayo> salidaActual = new HashSet<Rayo>();
		Set<Rayo> salidaActual1;
		Set<Rayo> salidaActual2;
		Set<Rayo> auxiliar1 = new HashSet<Rayo>();
		Rayo[] dir = new Rayo[4];
		
		for(Rayo rayo : anterior){
			int i;
			if(rayo.isEntrando()){
				i = rayo.getOrientacion();
			} else {
				i = (rayo.getOrientacion()+2)%4;
			}
			dir[i] = rayo;
		}
		
		auxiliar1.addAll(anterior);
		anterior.clear();
		
		salidaActual1 = ne.getSalida(entrada, auxiliar1);
		salidaActual2 = so.getSalida(entrada, auxiliar1);
		
		for(Rayo rayo : auxiliar1){
			int i;
			if(rayo.isEntrando()){
				i = rayo.getOrientacion();
			} else {
				i = (rayo.getOrientacion()+2)%4;
			}
			dir[i] = rayo;
		}
		
		anterior.clear();
		
		for(int i=0; i < dir.length; i++){
			if(dir[i] != null){
				anterior.add(dir[i]);
			}
		}
		
		salidaActual.addAll(salidaActual1);
		salidaActual.addAll(salidaActual2);
		
		return salidaActual;		
	}
}
